跳到主要内容

Go 的 for 坑

切片遍历的优化

遍历 slice

下面函数通过遍历切片,打印切片的下标和元素值,请问性能上有没有可优化的空间?

func RangeSlice(slice []int) {
for index, value := range slice {
// 这里忽略函数的实际意义
_, _ = index, value
}
}

遍历过程中每次迭代会对 index 和 value 进行赋值,如果数据量大或者 value 类型为 string 时,对 value 的赋值操作可能是多余的,可以在 for-range 中忽略 value 值,使用 slice[index] 引用 value 值。

遍历 map

下面函数通过遍历Map,打印Map的key和value,请问性能上有没有可优化的空间?

func RangeMap(myMap map[int]string) {
for key, _ := range myMap {
// 这里忽略函数的实际意义
_, _ = key, myMap[key]
}
}

函数中 for-range 语句中只获取 key 值,然后跟据 key 值获取 value 值,虽然看似减少了一次赋值,但通过 key 值查找 value 值的性能消耗可能高于赋值消耗。能否优化取决于 map 所存储数据结构特征、结合实际情况进行。

动态遍历

请问如下程序是否能正常结束?

func main() {
v := []int{1, 2, 3}
for i:= range v {
v = append(v, i)
}
}

能够正常结束。循环内改变切片的长度,不影响循环次数,循环次效在循环开始前就已经确定了。